package com.duoduo.common.util.anno.method;


import com.duoduo.common.api.constants.Constant;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**添加此注解后，在方法上添加分布式锁，KeyRule的计算规则必须是针对一个list元素，会对list里面的每一个元素进行spel表达式计算，对每一个计算出来的key加锁，全部加锁成功则返回加锁成功；否则加锁失败。
 * <br/>支持续租，重入。重入规则：所有的key都可以新加成功或重入成功
 * <br/>注意，只支持redis加锁方式
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LockList {
	
	/**当配置了多个集群时，可以指定使用哪个前缀的集群；单个集群的不用改
	 * @return
	 */
	String prefixName() default Constant.LOCK_DEFAULT_PRE_NAME;

	/**
	 * 获取锁的超时时间，默认3秒，等于0则立即返回，小于0则一直等待
	 * @return
	 */
	int timeOut() default 3;

	/**是否业务执行完成后释放锁，默认true
	 * @return
	 */
	boolean release() default true;
	
	/**可以手动指定获取requestId的spel表达式，也可以手动传到threadlocal里，用于锁重入
	 * @return
	 */
	String requestId() default Constant.EMPTY_STRING;

	/**key的生成规则
	 * @return
	 */
	KeyRule keyRule() default @KeyRule;

}
